package br.com.arquitetura.model;

import java.util.ArrayList;
import java.util.List;


public class ULA extends ComponenteVariasEntradas  {
	
	
	private boolean zero, negativo, igual, menor, maior, carry;
	
	public ULA(Mux a, Mux b) {
		super(new ArrayList<Componente>());
		List<Componente> entradas = getEntradas();
		entradas.add(a);
		entradas.add(b);
	}
	
	/*
	 * 0000 > S = A
	 * 0001 > S = A + 1
	 * 0010 > S = A + B
	 * 0011 > S = B - A
	 * 0100 > S = A and B
	 * 0101 > S = A or B
	 * 0110 > S = not A
	 * 0111 > S = 0
	 * 1000 > S = 0 - A
	 * 1001 > S = A << 1 -shl
	 * 1010 > S = A >> 1 -shr
	 */
	
	@Override
	public void atualizaSaida(int selecao) {	
		int sinaisValor = 0;
		
		Integer a = getEntradas().get(0).getSaida(),
				b = getEntradas().get(1).getSaida();
		
		switch (sinaisValor) {
		case 0:
			setSaida(a);
			zero = a == 0;
			break;

		case 1:
			a++;
			setSaida(a);
			carry = a < 0;
			break;
			
		case 2:	
			setSaida(a + b);
			igual = a == b;
			maior = b < a;
			menor = b > a;
			break;
			
		case 3:	
			setSaida(b - a);
			igual = a == b;
			maior = b < a;
			menor = b > a;
			break;
			
		case 4:	
			setSaida(a & b);
			break;
			
		case 5:	
			setSaida(a | b);
			break;
			
		case 6:
			setSaida(~a);
			break;
			
		case 7:
			setSaida(0);
			zero = true;
			negativo = false;
			break;
			
		case 8:
			a = -a;
			setSaida(a);
			zero = a == 0;
			negativo = a < 0;
			break;
			
		case 9:
			a = a << 1;
			setSaida(a);
			zero = a == 0;
			carry = a < 0;
			break;
			
		case 10:
			a = a >> 1;
			setSaida(a);
			zero = a == 0;
			carry = false;
			break;
		default:
			break;
		}
	}

	
	
	public boolean isZero() {
		return zero;
	}

	public boolean isNegativo() {
		return negativo;
	}

	public boolean isIgual() {
		return igual;
	}

	public boolean isMenor() {
		return menor;
	}

	public boolean isMaior() {
		return maior;
	}

	public boolean isCarry() {
		return carry;
	}

	
	

}
